ABC104 C - All Green
https://atcoder.jp/contests/abc104/tasks/abc104_c
提出
code: python
d, g = map(int, input().split())
pd = list(map(int, input().split())) for _ in range(d)
res = 0
ans = 0
flag = True
# 点数の高いものから取っていく
for i in reversed(pd):
if (flag):
for j in range(i0)
print(i)
解答
code: python
import itertools
D, G = map(int, input().split())
p = []
c = []
for i in range(D):
P, C = int(i) for i in input().split()
p.append(P)
c.append(C)
all_pattern = itertools.product(0, 1, repeat=D)
ans = 10**10
for pattern in all_pattern:
score = 0 # 獲得した点数
cnt = 0 # 解いた問題の数
problems = []
for i in range(D):
if patterni == 1: # パターンが1ならその点数の問題を全問解く
score += (i+1) * 100 * pi + ci # 解いた問題の点数+ボーナス
cnt += pi # 全問を解いた数にインクリメント
else: # パターンが0なら,点数が足りない時に解く用に必要なので,問題を貯める
# パターン0の問題を解くとしても,全部解いてはダメで,最大でもp-1個の問題しか使えない
for _ in range(pi-1):
problems.append((i+1))
if score >= G: # 獲得した点数が目標点Gより高かったら,その時点で解いた問題数を報告
ans = min(ans, cnt)
continue # もう他の問題を解く必要がないので,次のパターンに移る
# Gに点数が足りない場合,全部解かないとした(パターンが0)各問題から,全問解かないように(p-1個から選んで),最小の問題数を探す
# リストproblemsに入ってる得点から,好きに選んで残りの点数を超えるようにする = 貪欲に高い点数から選んでいく
rest = (G - score)//100 # 残り必要な点数 / 100
m = len(problems) # 使用可能な問題の得点のリストの個数
problems = sorted(problems, reverse=True)
cnt2 = 0
for j in range(m):
rest -= problemsj
cnt2 += 1
if rest <= 0:
break
# 全問解いた時の問題数cntと残りで解いた問題の数の和が,このパターンにおける最小問題数
if rest <= 0: # ちゃんと全部解き終わっていたらOK
ans = min(ans, cnt + cnt2)
print(ans)
テーマ
#itertools
蟻本 2-1 部分和問題
提出
code: python
d, g = map(int, input().split())
pc = list(map(int, input().split())) for _ in range(d)
print(pc)
# p1 = 100, 200, 800
# p2 = 200, 400, 600, 800, 1800
解答
code: python
d, g = map(int, input().split())
pc = list(map(int, input().split())) for _ in range(d)
ans = 10001
for bit in range(2 ** d):
score = 0
res = 0
for i in range(d):
p, c = pci0, pci1
# 全完対象
if ((bit >> i) & 1):
score += 100 * (i+1) * p + c
res += p
if score >= g:
ans = min(ans, res)
else:
for i in range(d-1, -1, -1):
if ((bit >> i) & 1):
continue # すでに全完していたらスキップ
p = pci0
for j in range(p):
if score >= g:
break
score += 100*(i+1) # 1つ追加する
res += 1
if score >= g:
ans = min(ans, res)
break
print(ans)
メモ
ABC104 C – All Green(bit全探索・論理演算)
Python de アルゴリズム(bit全探索)